package com.honeycomb.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.StringTokenizer;

public class IpAddr {

    /**
     * 获得当前主机的ip地址。
     */
    public static int getIp(InetAddress ipAddr) {
        //最好不要使用getHostName()方法获得主机名，因为不同平台的主机名格式可能不同.
        //为了屏蔽这种差异，可以使用getAddress()方法得到格式相同的IP地址。
        int[] ip = new int[4];
            //the highest order byte of the address is in getAddress()[0].
        byte[] hostAddr = ipAddr.getAddress();
        ip[0] = (((int) hostAddr[0]) << 24) & 0xff000000;
        ip[1] = (((int) hostAddr[1]) << 16) & 0x00ff0000;
        ip[2] = (((int) hostAddr[2]) << 8) & 0x0000ff00;
        ip[3] = (((int) hostAddr[3]) << 0) & 0x000000ff;
         return ip[0] | ip[1] | ip[2] | ip[3];
    }
    
    
    public static int getHostIp() {
        //最好不要使用getHostName()方法获得主机名，因为不同平台的主机名格式可能不同.
        //为了屏蔽这种差异，可以使用getAddress()方法得到格式相同的IP地址。
        int[] ip = new int[4];
        try {
        	return getIp(InetAddress.getLocalHost());
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        }
        return ip[0] | ip[1] | ip[2] | ip[3];
    }
    /**
     * 把整数类型的IP地址转换为字符串格式。
     * @param ipAddr 整数类型的IP地址。
     * @return 字符串格式的IP地址，如"172.18.15.1"。
     */
    public static String toString(int ipAddr) {
        if (ipAddr == 0) {
            return "0.0.0.0";
        }

        int[] ip = new int[4];
        StringBuffer strBuf = new StringBuffer();
        for (int i = 3; i >= 0; i--) {
            ip[i] = (ipAddr >> (i * 8)) & 0x000000ff;
            strBuf.append(ip[i]);
            if (i > 0) {
                strBuf.append(".");
            }
        }
        return strBuf.toString();
    }
    
    /**
     * 把字符串类型的IP地址转换为整数格式。
     * @param ipAddr 字符串类型的IP地址，如"172.18.15.1"。
     * @return 整数格式的IP地址。
     */
    public static int getIp(String ipAddr) {
        if (ipAddr == null || ipAddr.equals("")) {
            return 0;
        }
        StringTokenizer st = new StringTokenizer(ipAddr, ".");
        int count = st.countTokens();
        if (count != 4) {
            return 0;
        }
        int ip = 0;
        for (int i = 0; i < count; i++) {
            try {
                int tmp = Integer.parseInt(st.nextToken());
                if (tmp < 0 || tmp > 255) {
                    return 0;
                }
                ip |= tmp << ((3 - i) * 8);
            } catch (NumberFormatException ex) {
                return 0;
            }
        }
        return ip;
    }
}
